package HashMap.Nodo.Subclases;

import HashMap.Nodo.Categoria;
import HashMap.Nodo.Clase;
import HashMap.Nodo.Nodo;
import HashMap.Nodo.TipoBasicoDeDatos;

public class Puntero implements Nodo {

    private String nombre;
    private TipoBasicoDeDatos tipoBasico;
    private Categoria categoria;
    private Clase clase;
    private int nivelDeIndireccion;
    private int numeroDeParametros;
    private int posicionDeParametro;
    private String operacion;

    public Puntero(String nombre, TipoBasicoDeDatos tipoBasico, Categoria categoria, int nivelDeIndireccion, String operacion) {
        this.nombre = nombre;
        this.tipoBasico = tipoBasico;
        this.categoria = categoria;
        this.nivelDeIndireccion = nivelDeIndireccion;
        this.clase = Clase.PUNTERO;
        this.operacion = operacion;
    }

    @Override
    public Clase getClase() {
        return this.clase;
    }

    @Override
    public String getNombre() {
        if (nombre != null) {
            return this.nombre;
        } else {
            return "";
        }
    }

    @Override
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Override
    public void clearNombre() {
        this.nombre = null;
    }

    @Override
    public int getNumeroDeParametros() {
        if (this.categoria == Categoria.FUNCION) {
            return this.numeroDeParametros;
        } else {
            throw new RuntimeException("Error de tipos incompatibles. Debería ser Funcion y "
                    + " es un " + categoria);
        }
    }

    @Override
    public void setNumeroDeParametros(int numeroDeParametros) {
        if (this.categoria == Categoria.FUNCION) {
            this.numeroDeParametros = numeroDeParametros;
        } else {
            throw new RuntimeException("Error de tipos incompatibles. Debería ser Funcion y "
                    + " es un " + categoria);
        }
    }

    @Override
    public int getPosicionDeParametro() {
        if (this.categoria == Categoria.PARAMETRO) {
            return this.posicionDeParametro;
        } else {
            throw new RuntimeException("Error. No es un parámetro."
                    + " Es un " + categoria);
        }
    }

    @Override
    public void setPosicionDeParametro(int posicionDeParametro) {
        if (this.categoria == Categoria.PARAMETRO) {
            this.posicionDeParametro = posicionDeParametro;
        } else {
            throw new RuntimeException("Error. No es un parámetro."
                    + " Es un " + categoria);
        }
    }

    @Override
    public TipoBasicoDeDatos getTipoBasicoDeDatos() {
        return this.tipoBasico;
    }

    @Override
    public int getNivelDeIndireccion() {
        return this.nivelDeIndireccion;
    }

    @Override
    public void setNivelDeIndireccion(int nivelDeIndireccion) {
        this.nivelDeIndireccion = nivelDeIndireccion;
    }

    @Override
    public Categoria getCategoria() {
        return this.categoria;
    }

    @Override
    public String generarCodigoNASM() {
        return nombre + " resd 1 "; //tamaño de variable --> una palabra doble
    }

    @Override
    public Nodo copiarNodo() {
        Puntero puntero = new Puntero(nombre, tipoBasico, categoria, nivelDeIndireccion, operacion);
        if (this.categoria == Categoria.FUNCION) {
            puntero.setNumeroDeParametros(numeroDeParametros);
        }
        if (this.categoria == Categoria.PARAMETRO) {
            puntero.setPosicionDeParametro(posicionDeParametro);
        }
        return puntero;
    }

    public void aumentarNivelDeIndireccion() {
        this.nivelDeIndireccion = this.nivelDeIndireccion + 1;
    }

    @Override
    public void setOperacion(String operacion) {
        this.operacion = operacion;
    }

    @Override
    public String getOperacion() {
        return this.operacion;
    }
}
